#include <typescommon.h>

// 字符串操作函数strcpy、strlen、strcmp、strcat、strchr、strstr、strtok只针对字符串。
// 不是ASCII码的数据，可以通过memcpy、memset、memcmp、memchr

void check_memset()
{
    char tmpbuffer[10];
    // 将tmpbuffer每个字节都配成1.
    memset(tmpbuffer, 1, sizeof(tmpbuffer));
    for (int i = 0; i < sizeof(tmpbuffer); i++)
    {
        if(tmpbuffer[i] != 1)
        {
            logerror("index %d error", i);
        }
    }
    logdebug("memset finish!");
}

void check_memcpy()
{
    char tmpbuffera[10];
    char tmpbufferb[10];
    // 将tmpbuffer每个字节都配成1.
    memset(tmpbuffera, 1, sizeof(tmpbuffera));
    // 将a拷贝到b中。
    memcpy(tmpbufferb, tmpbuffera, sizeof(tmpbuffera));
    logdebug("memcpy finish!");

    //将地址0的数据拷贝到tmpbufferb中。
    // 系统有些有些空间不能写也不能读。(NULL==0)就是不能读写的地址。
    // 备注：NULL读也不可以。
    // memcpy(tmpbufferb, NULL, sizeof(tmpbufferb));//本条语句会崩溃。

    // 说明memcpy不光要考虑目标地址空间够、且可访问。而且也要考虑源地址的数据也要可读取。
    // 增强板：
}

// 说明memcpy不光要考虑目标地址空间够、且可访问。而且也要考虑源地址的数据也要可读取。
// 增强板：
void memcpyPro(char *dest, int destSize, const char *src, int srcSize)
{
    // 如果destSize > srcSize成立则用小的srcSize；如果不成立，使用小的destSize。
    int tmpsize = destSize > srcSize ? srcSize : destSize;
    if(src == NULL || dest ==NULL)
    {
        logwarn("copy error");
        return;
    }
    memcpy(dest, src, tmpsize);
}

void check_memsetPro()
{
    char tmpbufferb[10];
    memcpyPro(tmpbufferb, sizeof(tmpbufferb), NULL, sizeof(tmpbufferb));
}

void check_memcmp()
{
    char tmpbuffera[10];
    char tmpbufferb[10];
    // 将tmpbuffer每个字节都配成1.
    memset(tmpbuffera, 'a', sizeof(tmpbuffera));
    // 将a拷贝到b中。
    memcpy(tmpbufferb, tmpbuffera, sizeof(tmpbuffera));

    // 完全一样，返回0
    int tmpflag = memcmp(tmpbufferb, tmpbuffera, sizeof(tmpbuffera));
    logdebug("cmp finish flag=%d", tmpflag);

    //返回-1, 'a'-'c'的值。
    tmpflag = memcmp(tmpbufferb, "cc", sizeof(tmpbufferb));
    logdebug("cmp finish flag=%d", tmpflag);


    //返回32, 'a' - 'A'的值。
    tmpflag = memcmp(tmpbufferb, "AA", sizeof(tmpbufferb));
    logdebug("cmp finish flag=%d", tmpflag);
    logdebug("memset finish!");
}


int main(int argc, char **argv)
{
    check_memset();
    check_memcpy();
    check_memsetPro();
    check_memcmp();
    return 1;
}
